/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package fr.istia.gesstages.dao.file;

import fr.istia.gesstages.dao.IDaoUser;
import fr.istia.gesstages.dao.file.persistence.FilePersister;
import fr.istia.gesstages.exception.PortailException;
import fr.istia.gesstages.jpa.User;
import fr.istia.gesstages.jpa.UserType;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 *
 * @author usrlocal
 */
public class DaoUserFile implements IDaoUser {

    File fichier;
    Map<Integer, User> idMap;
    Map<String, User> loginMap;
    FilePersister<User> persister;

    public DaoUserFile(File fichier, FilePersister<User> persister) {
        this.fichier = fichier;
        this.persister = persister;
        this.idMap = new HashMap<Integer, User>();
        this.loginMap = new HashMap<String, User>();
        try {
            List<User> users = this.persister.readAll(User.class, new FileInputStream(fichier));
            for (User u : users)
                add(u);
        } catch (FileNotFoundException ex) {
            throw new PortailException("Le fichier d'utilisateurs n'a pas pu être analysé", ex);
        }
    }

    public User create(User user) {
        if(loginMap.containsKey(user.getLogin()))
            throw new PortailException("L'utilisateur ne peut pas être créé car une entité de même login existe déjà : " + user.getLogin());
        return add(user);
    }
    
    protected User add(User u){
        idMap.put(u.getId(), u);
        loginMap.put(u.getLogin(), u);
        return u;
    }

    public User update(User user) {
        return add(user);
    }

    public void delete(User user) {
        idMap.remove(user.getId());
        loginMap.remove(user.getLogin());
    }

    public User find(int id) {
        return idMap.get(id);
    }

    public User findByLogin(String login) {
        return loginMap.get(login);
    }

    public List<User> findAll() {
        return new ArrayList<User>(idMap.values());
    }

    public List<User> findArchived(String year) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void archiveAll() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void deleteAll() {
        Collection<User> users = idMap.values();
        for(User u : users)
            delete(u);
    }
    
    protected void writeAll(){
        try {
            persister.writeAll(
                new ArrayList<User>(idMap.values()),
                new FileOutputStream(fichier)
            );
        } catch (FileNotFoundException ex) {
            throw new PortailException("Le fichier d'export n'existe pas !", ex);
        }
    }

    public void close() {
        writeAll();
    }

    public List<User> findByType(UserType type) {
        List<User> users = new ArrayList<User>();
        for(User u : loginMap.values()){
            if(u.getType().getId() == type.getId())
                users.add(u);
        }
        return users;
    }

    public User refresh(User user) {
        user = loginMap.get(user.getLogin());
        return user;
    }
}
